home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Delphi Programmer's Power Pack
/
Delphi Volume 1.iso
/
e_to_l
/
fbuilder
/
delphi
/
demos
/
calcfrm1.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1996-09-15
|
5KB
|
204 lines
{ FormulaBuilder }
{ YGB Software, Inc. }
{ Copyright 1995 Clayton Collie }
{ All rights reserved }
{ Demo of a calculator. Supports Variables }
unit Calcfrm1;
interface
uses
FBCalc, FBComp,
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, Buttons, StdCtrls, ExtCtrls;
type
TcalcForm = class(TForm)
Bevel1: TBevel;
Button7: TSpeedButton;
Button8: TSpeedButton;
Button9: TSpeedButton;
Button4: TSpeedButton;
Button5: TSpeedButton;
Button6: TSpeedButton;
Button1: TSpeedButton;
Button2: TSpeedButton;
Button3: TSpeedButton;
Button0: TSpeedButton;
PlusMinusBtn: TSpeedButton;
PeriodBtn: TSpeedButton;
MultBtn: TSpeedButton;
MinusBtn: TSpeedButton;
DivBtn: TSpeedButton;
PlusBtn: TSpeedButton;
StatusPanel: TPanel;
Bevel2: TBevel;
LParenBtn: TSpeedButton;
RParenBtn: TSpeedButton;
ExponenBtn: TSpeedButton;
EqualBtn: TSpeedButton;
Bevel3: TBevel;
ExitBtn: TBitBtn;
ClearBtn: TBitBtn;
BackBtn: TBitBtn;
FormulaField: TComboBox;
VariablesBtn: TBitBtn;
Panel2: TPanel;
FunctionNames: TListBox;
CalcBtn: TBitBtn;
Expression: TExpression;
procedure Button7Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure PlusMinusBtnClick(Sender: TObject);
procedure ClearBtnClick(Sender: TObject);
procedure LParenBtnClick(Sender: TObject);
procedure CalcBtnClick(Sender: TObject);
procedure BackBtnClick(Sender: TObject);
procedure VariablesBtnClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FunctionNamesDblClick(Sender: TObject);
procedure EqualBtnClick(Sender: TObject);
private
{ Private declarations }
Procedure DoCalculation;
public
{ Public declarations }
end;
Procedure DisplayCalc;
Var calcForm : TCalcForm;
implementation
uses vardlg,fbmisc;
{$R *.DFM}
Procedure DisplayCalc;
var calcFm : TCalcForm;
begin
CalcFm := TCalcForm.Create(NIL);
CalcFm.ShowModal;
CalcFm.Free;
end;
Function GetFuncNames(vname : pchar;
vtype : byte;
parms : pchar;
minPrms : byte;
EnumData : longint):integer; export;
var proto,tmp : string[60];
i : integer;
list : TStringList absolute EnumData;
begin
{ Were interested only in math functions }
if not (vType in [vtInteger,vtFloat]) then exit;
tmp := strpas(parms);
for i := 1 to length(tmp) do
if not (tmp[i] in ['I','F']) then exit;
{if pos }
Proto := ShortPrototype(strpas(vname),tmp,length(tmp),minprms);
if not Assigned(list) then
List := TStringList.Create;
List.Add( proto );
end;
Function getFunctionPrototypes : TStringList;
begin
Result := TStringList.Create;
FBEnumFunctions(getFuncNames,longint(Result));
end;
procedure TcalcForm.Button7Click(Sender: TObject);
var s : string[4];
begin
s := (Sender as TSpeedButton).Caption[2];
if pos(s,'*^+-/') > 0 then s := ' '+s+' ';
FormulaField.text := FormulaField.text + s;
end;
procedure TcalcForm.FormCreate(Sender: TObject);
var theList : TStringList;
begin
thelist := getFunctionPrototypes;
FunctionNames.Items.AddStrings(thelist);
thelist.free;
end;
Procedure TCalcForm.DoCalculation;
var s : string[75];
begin
if (FormulaField.text = '') then exit;
with Expression do begin
Formula := FormulaField.Text;
if Status = EXPR_SUCCESS then
begin
s := Expression.AsString;
FormulaField.items.add(FormulaField.text);
{StatusPanel.caption := '> ' + s;}
FormulaField.Text := s;
end
else
StatusPanel.caption := '> Error : ' + StatusText;
end;
end;
procedure TCalcForm.PlusMinusBtnClick(Sender: TObject);
begin
FormulaField.text := '-1 * (' + FormulaField.text + ')';
end;
procedure TcalcForm.ClearBtnClick(Sender: TObject);
begin
FormulaField.text := '';
end;
procedure TcalcForm.LParenBtnClick(Sender: TObject);
begin
FormulaField.text := FormulaField.text + (sender as TSpeedButton).caption[1];
end;
procedure TcalcForm.CalcBtnClick(Sender: TObject);
begin
DoCalculation;
end;
procedure TcalcForm.BackBtnClick(Sender: TObject);
var s : string;
len : integer;
begin
s := FormulaField.Text;
len := length(s);
if (len > 0) then
FormulaField.text := copy(s,1,pred(len));
end;
procedure TcalcForm.VariablesBtnClick(Sender: TObject);
begin
ManageVariables(Expression.Handle);
end;
procedure TcalcForm.FormDestroy(Sender: TObject);
begin
Expression.Free;
end;
procedure TcalcForm.FunctionNamesDblClick(Sender: TObject);
begin
with functionNames do
if ItemIndex > -1 then
FormulaField.Text := FormulaField.Text + FunctionNames.Items[ItemIndex];
end;
procedure TcalcForm.EqualBtnClick(Sender: TObject);
begin
DoCalculation;
end;
end.